<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="lUhXM" id="lUhXM"><span data-lake-id="u05ad8031" id="u05ad8031">典型回答</span></h1>
  <h3 data-lake-id="D6pbY" id="D6pbY"><span data-lake-id="u323fce18" id="u323fce18" style="color: var(--tw-prose-headings)">Java堆溢出</span></h3>
  <p data-lake-id="uf63efd2e" id="uf63efd2e"><span data-lake-id="u02477d68" id="u02477d68">​</span><br></p>
  <p data-lake-id="u5f76a342" id="u5f76a342"><span data-lake-id="u4266e488" id="u4266e488">Java堆用于存储对象实例。堆溢出通常是由于创建了太多对象，而没有足够的堆内存来存储这些对象。</span></p>
  <p data-lake-id="u1273ca52" id="u1273ca52"><span data-lake-id="ub774e7fd" id="ub774e7fd">​</span><br></p>
  <p data-lake-id="uf59528f5" id="uf59528f5"><span data-lake-id="u6da274f5" id="u6da274f5">我们只需要写一个死循环， 在里面不断地创建对象就行了。一直运行下去，就会导致OOM</span></p>
  <p data-lake-id="u6d88103b" id="u6d88103b"><span data-lake-id="u2b045abb" id="u2b045abb">​</span><br></p>
  <pre lang="java"><code>
import java.util.ArrayList;
import java.util.List;

public class HeapOverflow {
    public static void main(String[] args) {
        List&lt;Object&gt; objects = new ArrayList&lt;&gt;();
        while (true) {
            objects.add(new Object()); // 不断创建对象并保留引用
        }
    }
}

</code></pre>
  <p data-lake-id="u98870d49" id="u98870d49"><br></p>
  <h3 data-lake-id="a4Ysy" id="a4Ysy"><span data-lake-id="u2d224914" id="u2d224914">Java 栈溢出</span></h3>
  <p data-lake-id="u1bd88bd3" id="u1bd88bd3"><br></p>
  <p data-lake-id="u31975ade" id="u31975ade"><span data-lake-id="udbd82801" id="udbd82801">Java栈用于存储局部变量和方法调用。栈溢出通常是因为过深的方法调用，如递归调用没有正确的终止条件。</span></p>
  <p data-lake-id="ucec76fa2" id="ucec76fa2"><span data-lake-id="ud1507b90" id="ud1507b90">​</span><br></p>
  <pre lang="java"><code>
public class StackOverflow {
    public static void main(String[] args) {
        recursiveMethod(1); // 递归调用，没有终止条件
    }

    private static void recursiveMethod(int i) {
        recursiveMethod(i);
    }
}

</code></pre>
  <p data-lake-id="uf07a2d24" id="uf07a2d24"><br></p>
  <h3 data-lake-id="DHE1z" id="DHE1z"><span data-lake-id="u79c222ba" id="u79c222ba" style="color: var(--tw-prose-headings)">元空间溢出</span></h3>
  <p data-lake-id="u17838b8d" id="u17838b8d"><br></p>
  <p data-lake-id="u73a2f1ab" id="u73a2f1ab"><span data-lake-id="u3d73cfa5" id="u3d73cfa5">元空间用于存储类的元数据。元空间溢出通常是由于加载了太多类或者类的元数据过大。</span></p>
  <p data-lake-id="u609595a0" id="u609595a0"><span data-lake-id="u5e8e27c3" id="u5e8e27c3">​</span><br></p>
  <pre lang="java"><code>
import javassist.ClassPool;

public class MetaspaceOverflow {
    public static void main(String[] args) {
        ClassPool classPool = ClassPool.getDefault();
        for (int i = 0; ; i++) {
            classPool.makeClass("Class" + i).toClass(); // 动态创建大量的类
        }
    }
}

</code></pre>
  <p data-lake-id="uedebfa0c" id="uedebfa0c"><span data-lake-id="u762b95c9" id="u762b95c9">​</span><br></p>
  <p data-lake-id="u18afe82c" id="u18afe82c"><span data-lake-id="u5e02664b" id="u5e02664b">对于元空间溢出的示例，需要使用javassist这个第三方库来动态创建类。你可以通过 Maven 将 javassist 添加到项目依赖中。</span></p>
 </body>
</html>